// Either函子
// 1. Either两者中的任何一个，类似if...else...的处理
// 2. 异常会让函数变的不纯，Either函子可以用来做异常处理

class Left {
    static of(value) {
        return new Left(value)
    }
    constructor(value) {
        this._value = value
    }
    map(fn) {
        return this
    }
}

class Right {
    static of(value) {
        return new Right(value)
    }
    constructor(value) {
        this._value = value
    }
    map(fn) {
        return Right.of(fn(this._value))
    }
}

function parseJSON(str) {
    try {
        return Right.of(JSON.parse(str))
    } catch (e) {
        return Left.of({ error: e.message })
    }
}

const r = parseJSON('{"name": 17}')
    .map(x => x.name)
    .map(x => null)
    .map(x => x.split('_'))



console.log(r);



